package cn.iocoder.yudao.module.shop.service.dayuser;

import java.time.LocalDateTime;
import java.util.*;
import javax.validation.*;

import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletRechargeDO;
import cn.iocoder.yudao.module.shop.controller.admin.dayuser.vo.*;
import cn.iocoder.yudao.module.shop.dal.dataobject.dayuser.ShopDayUserDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.ShopOrderDO;
import cn.iocoder.yudao.module.shop.enums.store.ChargeTypeEnum;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;

/**
 * 艾灸师每日统计 Service 接口
 *
 * @author 曹建伟
 */
public interface ShopDayUserService {

    /**
     * 创建艾灸师每日统计
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createDayUser(@Valid ShopDayUserCreateReqVO createReqVO);

    /**
     * 更新艾灸师每日统计
     *
     * @param updateReqVO 更新信息
     */
    void updateDayUser(@Valid ShopDayUserUpdateReqVO updateReqVO);

    /**
     * 删除艾灸师每日统计
     *
     * @param id 编号
     */
    void deleteDayUser(Long id);

    /**
     * 获得艾灸师每日统计
     *
     * @param id 编号
     * @return 艾灸师每日统计
     */
    ShopDayUserDO getDayUser(Long id);

    /**
     * 获得艾灸师每日统计列表
     *
     * @param ids 编号
     * @return 艾灸师每日统计列表
     */
    List<ShopDayUserDO> getDayUserList(Collection<Long> ids);

    List<ShopDayUserDO> getDayUserListByUserId(LocalDateTime time, Long userId);

    Boolean confirm(Long id);

    /**
     * 获得艾灸师每日统计分页
     *
     * @param pageReqVO 分页查询
     * @return 艾灸师每日统计分页
     */
    PageResult<ShopDayUserDO> getDayUserPage(ShopDayUserPageReqVO pageReqVO);

    /**
     * 获得艾灸师每日统计列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 艾灸师每日统计列表
     */
    List<ShopDayUserDO> getDayUserList(ShopDayUserExportReqVO exportReqVO);

    Boolean recordOrder(ShopOrderDO order, Boolean isNewMember, Long rechargeOrderCount);

    Boolean rollbackOrder(ShopOrderDO order);

    Boolean recordHoliday(LocalDateTime time, AdminUserRespDTO user);

    Boolean recordPayOrder(PayWalletRechargeDO payOrder, Long masterId, ChargeTypeEnum chargeType);

    Boolean recordTimesChargePay(Integer payPrice, Long memberId, Long masterId, ChargeTypeEnum chargeType, Long tenantId);

    List<ShopDayUserDO> getDayUserListByTime(LocalDateTime startTime, LocalDateTime endTime, Long tenantId);

    void dayJob(List<AdminUserRespDTO> userList);
}
